<?php

define('UC_CHARS_LATIN1', "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ");
define('LC_CHARS_LATIN1', "àáâãäåæçèéêëìíîïðñòóôõöøùúûüý");

require_once APPPATH . 'dao/TipoDocumentoDAO.php';

require_once APPPATH . 'dao/SocioDAO.php';

/**
 * Clase encargada de Manejar la Inscripción de un nuevo Socio.
 */
class Socio extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    /*
     * index() se ejecuta por defecto al ser cargado del controlador
     */

    public function index() {
        //Se comprueba si el controlador es invocado por primera vez, o
        //si es invocado como producto de enviar el formulario en la vista
        //formularioFiltrado.php
        if (!$this->input->post('submit')) {
            //Si el controlador es invocado por primera vez, se carga la vista inicial
            $this->cargarVista();
        } else {
            //Si el controlador es cargado por el envío del formulario, entonces
            //son validados los datos enviados desde éste
            $this->validarFiltrado();
        }
    }

    /*
     * Se encarga de cargar las vistas correspondientes al formulario de búsqueda
     * y la respuesta de la búsqueda
     */

    public function cargarVista() {
        //Se obtienen los datos para crear los campos del formulario
        $dataFormularioFiltrado = $this->obtenerCamposFiltrado();

        //Se cargan los datos necesarios para armar la cabecera del sistema
        $dataCab['title'] = 'Sistema de Administración de Socios';
        $dataCab['textoSuperiorIzq'] = 'DEFENSORES DE LA TECNO';
        $dataCab['css'] = '<link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/css_pestanias.css" media="screen" />
                               <link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/datos_form_css.css" media="screen" />';
        $dataCab['nombre'] = 'Administrador';
        $dataCab['posicionamiento'] = 'Home > Consultar Socios';

        $dataResultadoFiltrado = null;

        //Se ve si se ha hecho una consulta, para mostrar los datos corespondientes
        //a la página de resultados en cuestión
        if ($this->input->get("pagina")) {
            $dataResultadoFiltrado['socios'] = $this->realizarConsulta();

            $dataFormularioFiltrado = $this->obtenerCamposFiltrado();

            $dataFormularioFiltrado['totalRegistros'] = $this->getCantSocios();
            $dataFormularioFiltrado['cantReg'] = 10;
            $num_pag = $this->input->get("pagina");
            $dataFormularioFiltrado['numPag'] = (!$num_pag) ? 1 : $num_pag;
        }

        //Se carga una cabecera, que contiene el head y las etiquetas de apertura
        //de html y body
        $this->load->view('cabecera', $dataCab);
        //Se carga el formulario de filtrado de búsqueda de socios
        $this->load->view('formularioFiltrado', $dataFormularioFiltrado);
        //Se carga la vista que contiene la tabla con los resultados de la búsqueda
        $this->load->view('resultadoFiltrado', $dataResultadoFiltrado);
        //Se carga una vista con etiquetas de cierre de html y body
        $this->load->view('cierre');
    }

    /*
     * Retorna arreglos con los parámetros necesarios para crear los campos del
     * formulario.
     * Dichos parámetros son pasados a métodos del Form Helper de CodeIgniter
     */

    public function obtenerCamposFiltrado() {

        /* Campo Apellido */
        $data['apellido'] = array(
            'name' => 'apellido',
            'id' => 'apellido',
            'value' => set_value('apellido'),
            'maxlength' => '30',
            'size' => '35',
        );

        /* Lista Tipo Documento */
        $tipoDocDAO = new TipoDocumentoDAO();
        $tipos = $tipoDocDAO->getTipoDocumento();
        $data['tiposDocumento'] = array();
        $data['tiposDocumento'][] = 'Seleccione Tipo';
        foreach ($tipos as $tipo)
            $data['tiposDocumento'][] = $tipo->getNombre();

        /* Campo Numero Documento */
        $data['numeroDocumento'] = array(
            'name' => 'numeroDocumento',
            'id' => 'numeroDocumento',
            'value' => set_value('numeroDocumento'),
            'maxlength' => '8',
            'size' => '15',
        );

        return $data;
    }

    /*
     * Toma la decisión de cargar la vista inicial mostrando los errores cometidos
     * al cargar el formulario, o de cargar la vista nuevamente pero con el resultado
     * de la búsqueda
     */

    public function validarFiltrado() {
        //Primero valida que todos los campos del formulario sean correctos.
        //Si no es así, vuelve a mostrar el formulario con los respectivos errores.
        if ($this->validacionDatosFormulario() === FALSE) {
            $this->cargarVista();
        } else {

            //Si los datos del formulario son correctos, se realiza la consulta
            //correspondiente y se cargan las vistas, pero con los resultados de
            //la consulta en la vista resultadoFiltrado
            $dataResultadoFiltrado['socios'] = $this->realizarConsulta();

            $dataFormularioFiltrado = $this->obtenerCamposFiltrado();

            $dataFormularioFiltrado['totalRegistros'] = $this->getCantSocios();
            $dataFormularioFiltrado['cantReg'] = 10;
            $num_pag = $this->input->get("pagina");
            $dataFormularioFiltrado['numPag'] = (!$num_pag) ? 1 : $num_pag;

            //Se cargan los datos necesarios para armar la cabecera del sistema
            $dataCab['title'] = 'Sistema de Administración de Socios';
            $dataCab['textoSuperiorIzq'] = 'DEFENSORES DE LA TECNO';
            $dataCab['css'] = '<link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/css_pestanias.css" media="screen" />
                                   <link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/datos_form_css.css" media="screen" />';
            $dataCab['nombre'] = 'Administrador';
            $dataCab['posicionamiento'] = 'Home > Consultar Socios';

            $this->load->view('cabecera', $dataCab);
            $this->load->view('formularioFiltrado', $dataFormularioFiltrado);
            $this->load->view('resultadoFiltrado', $dataResultadoFiltrado);
            $this->load->view('cierre');
        }
    }

    /*
     * Valida los datos introducidos en el formulario mediante el uso de la librería
     * Form_validation de CodeIgniter
     */

    public function validacionDatosFormulario() {
        //Regla que valida los datos ingresados en el campo apellido del formulario
        //Éste campo sólo admite letras, apóstrofes y espacios en blanco y es de hasta 30 caracteres
        //Además, se comprueba si no se está haciendo un ataque de SQL Injection o XSS
        $this->form_validation->set_rules('apellido', 'Apellido', 'alphaApostropheSpace|max_length[30]|xss_clean|cleanQuery');

        //Regla que valida los datos ingresados en el campo numero documento del formulario
        //Éste campo sólo admite números y una longitud de 8
        //Además, se comprueba si no se está haciendo un ataque de SQL Injection o XSS
        $this->form_validation->set_rules('numeroDocumento', 'N&ordm; Documento', 'formatoNumeroDeDocumento|menorNumeroDeDocumentoPosible|xss_clean|cleanQuery');

        //Se ejecutan las reglas establecidas sobre los campos del formulario en cuestión
        //y se retornan los resultados de la validación
        return $this->form_validation->run();
    }

    /*
     * Se encarga de invocar el método que finalmente realizará la consulta a la BD
     */

    public function realizarConsulta() {

        $cant_reg = 10;
        $num_pag = $this->input->get("pagina");

        if (!$num_pag) {
            $comienzo = 0;
            $num_pag = 1;
        }
        else
            $comienzo = ($num_pag - 1) * $cant_reg;

        //Se instancioa SocioDAO
        $socioDAO = new SocioDAO();
        //Se invoca un método en SocioDAO para recuperar los socios que cumplan
        //las reglas de filtrado

        return $socioDAO->getSociosBy($comienzo, $cant_reg, $this->input->post('tipoDocumento'), $this->input->post('numeroDocumento'), $this->fullUpper($this->input->post('apellido')));
    }

    private function getCantSocios() {

        //Se instancioa SocioDAO
        $socioDAO = new SocioDAO();

        //Se recuperan todos los socios que cunplen con las condiciones de filtrado
        $socios = $socioDAO->getAllSociosBy($this->input->post('tipoDocumento'), $this->input->post('numeroDocumento'), $this->fullUpper($this->input->post('apellido')));

        //Se cuentan los registros totales en la base de datos
        $i = 0;
        if (!empty($socios))
            foreach ($socios as $socio)
                $i++;

        return $i;
    }

    private function fullUpper($str) {

        $str = strtoupper(strtr($str, LC_CHARS_LATIN1, UC_CHARS_LATIN1));
        return strtr($str, array("ß" => "SS"));
    }

}

?>
